package com.test.deencredit.util_deencredit;

import static com.test.deencredit.config_deencredit.Constant_deencredit.AES_KEY_deencredit;
import static com.test.deencredit.config_deencredit.Constant_deencredit.AES_IV_deencredit;

import android.util.Base64;
import android.util.Log;

import java.nio.charset.StandardCharsets;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class AESCryptUtil_deencredit {

    // 名称
    private static final String AES_NAME_deencredit = "AES";

    // TODO: 模式，android端默认用 AES/CBC/PKCS5Padding 与 AES/CBC/PKCS7Padding 等价
    private static final String AES_MODE_deencredit = "AES/CBC/PKCS5Padding";

    /**
     * 加密
     *
     * @param key     每个产品都使用不一样的key。16位、24位、32位
     * @param iv      每个产品都使用不一样的iv。固定16位
     * @param message 待加密的内容
     * @return 加密后的字符串（Base64 default | Base64.NO_WRAP编码）
     */
    public static String encrypt_deencredit(String key, String iv, String message) {
        try {
            Cipher cipher = Cipher.getInstance(AES_MODE_deencredit);
            SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), AES_NAME_deencredit);
            IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
            byte[] encrypted = cipher.doFinal(message.getBytes(StandardCharsets.UTF_8));
            return Base64.encodeToString(encrypted, Base64.DEFAULT | Base64.NO_WRAP);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 加密 - TODO: 使用内部固定 key 与 iv
     *
     * @param message 待加密的内容
     * @return 加密后的字符串（Base64 default编码）
     */
    public static String encryptDefault_deencredit(String message) {
        //tag2024
        String result = encrypt_deencredit(AES_KEY_deencredit, AES_IV_deencredit, message);
        Log.w("---encrypt_src---", message );
        Log.w("---encrypt---", result );
        return result;
    }

    /**
     * 解密
     *
     * @param key              每个产品都使用不一样的key。16位、24位、32位
     * @param iv               每个产品都使用不一样的iv。固定16位
     * @param encryptedMessage 待解密的内容
     * @return 解密后的字符串
     */
    public static String decrypt_deencredit(String key, String iv, String encryptedMessage) {
        try {
            Cipher cipher = Cipher.getInstance(AES_MODE_deencredit);
            SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), AES_NAME_deencredit);
            IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
            byte[] encryptedBytes = Base64.decode(encryptedMessage, Base64.DEFAULT | Base64.NO_WRAP);
            byte[] decrypted = cipher.doFinal(encryptedBytes);
            return new String(decrypted, StandardCharsets.UTF_8);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 解密 - TODO: 使用内部固定 key 与 iv
     *
     * @param encryptedMessage 待解密的内容
     * @return 解密后的字符串
     */
    public static String decryptDefault_deencredit(String encryptedMessage) {
        //tag2024
        String result = decrypt_deencredit(AES_KEY_deencredit, AES_IV_deencredit, encryptedMessage);
        Log.w("---decrypt_src---", encryptedMessage );
        Log.w("---decrypt---", result );
        return result;
    }

}
